const path = require("path");
const express = require("express");
const multer = require("multer");
// 第三方写好了的 分片上传的服务端包
const { FileUploaderServer } = require("easy-file-uploader-server");

const app = express();

// 实例化 multer 得到一个 uploader
const uploader = multer();

// 实例化 FileUploaderServer
const fileUploader = new FileUploaderServer({
  // 临时文件路径
  tempFileLocation: path.join(__dirname, "./tempUploadFile"),
  // 最终文件路径
  mergedFileLocation: path.join(__dirname, "./mergedUploadFile"),
});

app.use(express.json());

// 定义一个大数组，用于存储当前上传过的文件md5【推荐应该是要入库】
const list = [];

/**
 * 文件查询
 */
app.post("/api/uploadSearch", async (req, res) => {
  const { md5 } = req.body;

  // 查询该 md5 是否已经上传过了
  if (list.includes(md5)) {
    // 上传过了
    res.send({ code: 1000, data: true });
  } else {
    // 没有上传过
    res.send({ code: 1000, data: false });
  }
});

/**
 * 初始化
 */
app.post("/api/uploadInit", async (req, res) => {
  // 1. 从请求体中获取 name 参数
  const { name } = req.body;
  // 2. 调用 fileUploader 的初始化
  //    返回一个唯一的 uploadId 该 id 需要在后续 上传接口与完成接口 中都需要回传回来
  const uploadId = await fileUploader.initFilePartUpload(name);
  // 3. 将 uploadId 响应给前端
  res.send({
    code: 1000,
    data: uploadId,
  });
});

/**
 * 上传
 *
 *  partFile - File or Blob
 *  uploadId - 初始化接口的时候返回给前端的 uploadId
 *  partIndex - 切片下标
 */
app.post("/api/uploadPart", uploader.single("partFile"), async (req, res) => {
  const { buffer } = req.file;
  const { uploadId, partIndex } = req.body;
  // 当前切片的 md5
  const partFileMd5 = await fileUploader.uploadPartFile(
    uploadId,
    partIndex,
    buffer
  );
  res.send({
    code: 1000,
    data: partFileMd5,
  });
});

/**
 * 上传成功
 *   uploadId - 初始化接口的时候返回给前端的 uploadId
 *   name - 文件名
 *   md5 - 最终hash
 */
app.post("/api/uploadComplete", async (req, res) => {
  const { uploadId, name, md5 } = req.body;

  // 将当前 md5 写入到 list 中
  list.push(md5);
  // 合并文件，得到一个文件的最终路径
  const { path: filePathOnServer } = await fileUploader.finishFilePartUpload(
    uploadId,
    name,
    md5
  );

  const suffix = filePathOnServer.split("mergedUploadFile")[1];
  console.log("suffix", filePathOnServer);
  res.send({
    code: 1000,
    data: suffix,
  });
});

app.listen(3000, () => {
  console.log("服务启动成功");
});
